home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gekikoh Dennoh Club 2
/
Gekikoh Dennoh Club Vol. 2 (Japan).7z
/
Gekikoh Dennoh Club Vol. 2 (Japan) (Track 01).bin
/
kowin
/
font
/
code131.lzh
/
code.c
next >
Wrap
C/C++ Source or Header
|
1995-09-01
|
13KB
|
549 lines
/*/ ******************************************************************* /*/
/*/ /*/
/*/ Code.win version 1.10 1990 11/20 by 小笠原博之 /*/
/*/ SPS0783 COR. /*/
/*/ /*/
/*/ v1.10 1991 1/16 Ko-Window 2.07 対応 /*/
/*/ v1.11 1991 2/2 フォントデータの獲得 /*/
/*/ v1.20 1991 2/4 コード計算の改良 /*/
/*/ v1.30 1991 3/11 Ko-Window 2.10 対応、UserSheet 対応 /*/
/*/ v1.31 1995 8/6 表示フォントの変更が可能になった (tvv編集用) /*/
/*/ ******************************************************************* /*/
#include <stdio.h>
#include <wlib.h>
#include <parts.h>
#include "mpat.h"
#define USERSHEET /**/
/** 区点コード変換 **/
#define JISKUTEN(a) ((a / 0x100 - 0x20)*100+ ((a & 0xff) - 0x20))
#define KUTENJIS(a) ((a / 100 +0x20)*0x100+ ((a % 100)+0x20 ))
/** 半角チェック **/
#define ishan(a) ((a>=0x8000&&a<=0x8100)||(a>=0xf000&&a<0xf600))
#define mJIS 0
#define mSJIS 1
#define mKUTEN 2
#define aJIS 0
#define aSJIS 1
#define aKUTEN 2
#define aCHAR 3
/* リソース */
#define MODEX (2+24+54+4)
#define MODEY 30
#define MODEXX (2+24+54+4+36+10)
#define MODEYY 50
#define MODESX (2+24+54+8)
#define MODESY 34
#define INCX 2
#define INCY 2
#define INCXX (12+4+2)
#define INCYY 13
#define INCSX 5
#define INCSY 2
#define DECX 2
#define DECY 15
#define DECXX (12+4+2)
#define DECYY 26
#define DECSX 5
#define DECSY 15
#define INPX (2+24+54+4)
#define INPY 6
/*/
/* イベント定義
/*/
#define EVENT (EventOpenON \
|EventRedrawON \
|EventCloseON \
|EventKeyON \
|EventMouseEnterON \
|EventMouseOutON \
|EventUserON \
|EventMouseSwitchON)
/*//////////////////////////////////////////////////////////////////////*/
/* グローバル宣言 */
/*//////////////////////////////////////////////////////////////////////*/
/*** function ***/
int EventExec();
/*** heap size ***/
/*int WindowHeapSize = 4 * 1024; /**/
unsigned char s_jis[10],
s_sjis[10],
s_kuten[10],
s_chr[4],
buf_jis[10];
InputClass i_jis;
int sjis= 0x819f;
int mode= mJIS;
char *modestr[ 3 ]={
"JIS",
"シフトJIS",
" 区点 "
};
int flag= FALSE;
int font= 16;
/*//////////////////////////////////////////////////////////////////////*/
/* メインルーチン */
/*//////////////////////////////////////////////////////////////////////*/
void
WindowMain( argc, argv )
char **argv;
{
int x,
y;
/*/
/* オプション解析
/*/
s_chr[2]= '\0';
for( x= y= 2 ; --argc ; ){
if( **++argv == '-' || **argv == '/' ){
switch( (*argv)[1] ){
case 'x':
x= atoi( *argv+2 );
break;
case 'y':
y= atoi( *argv+2 );
break;
case 's':
sjis= strtol( *argv+2, argv, 0 );
break;
case 'f':
font= atoi( *argv+2 );
if( font != 24 && font != 16 &&
font != 12 && font != 10 )
font= 16;
}
}
}
/*/
/* ウィンドウ設定
/*/
WindowSetEventAttr( WindowTitleOpen( x, y, 140-3, 58-2, NULL, "Code", Close|Push, EventExec ), EVENT );
}
/*//////////////////////////////////////////////////////////////////////*/
/* イベント処理ルーチン */
/*//////////////////////////////////////////////////////////////////////*/
EventExec( wp, info )
WindowID wp;
EventInfo *info;
{
int x;
DrawBuf buf[30];
switch( info->option ){
case EventOpen:
InputSet( &i_jis, INPX, INPY, buf_jis, 8, 9, 16 );
WindowRedraw( wp );
return TRUE;
case EventRedraw: {
int i= 12;
DrawSetClear( buf, 1 );
DrawSetCode( buf+1, 0 ); /* 4 */
DrawSetSymbol( buf+5, INCSX, INCSY, "+1", 9, 12 );
DrawSetSymbol( buf+6, DECSX, DECSY, "-1", 9, 12 );
DrawSetLine( buf+7, INCX, INCY, INCXX, INCYY, ShadowUp, OptionShadow );
DrawSetLine( buf+8, DECX, DECY, DECXX, DECYY, ShadowUp, OptionShadow );
DrawSetSymbol( buf+9, MODESX, MODESY, modestr[mode], 9, 12 );
DrawSetLine( buf+10, MODEX, MODEY, MODEXX, MODEYY, ShadowUp, OptionShadow );
DrawSetLine( buf+11, INPX, INPY+17, INPX+48, INPY+17, 0, OptionLine );
WindowDraw( wp, buf, i+InputSetDraw( buf+12, &i_jis ) );
return TRUE;
}
case EventClose:
WindowClose( wp );
WindowConnectionClose();
return TRUE;
case EventMouseSwitch:
if( info->x>INCX && info->x<INCXX && info->y>INCY && info->y<INCYY ){
if( info->RightStat ){
while( WindowGetEventInfo(info), info->RightStat ){
inc1();
DrawSetCode( buf, wp );
}
}else if( info->LeftON ){
inc1();
DrawSetCode( buf, wp );
}
return TRUE;
}else if( info->x>DECX && info->x<DECXX && info->y>DECY && info->y<DECYY ){
if( info->RightStat ){
while( WindowGetEventInfo(info), info->RightStat ){
dec1();
DrawSetCode( buf, wp );
}
}else if( info->LeftON ){
dec1();
DrawSetCode( buf, wp );
}
return TRUE;
}else if( info->LeftON && info->x>MODEX && info->x<MODEXX && info->y>MODEY && info->y<MODEYY ){
mode= (mode+1) % 3;
DrawSetSymbol( buf, MODESX, MODESY, modestr[mode], 9, 12 );
WindowDraw( wp, buf, 1 );
return TRUE;
}else if( info->LeftON ){
WindowID cwp,
awp;
EventInfo info2;
int area= aKUTEN;
mspatset();
mspat(1);
if( info->x < 24+2 )
area= aCHAR;
else if( info->y< 20 )
area= aJIS;
else if( info->y < 40 )
area= aSJIS;
while( !(WindowGetEventInfo(info) && info->LeftOFF) );
cwp= WindowGetChild( WindowRootID, info );
if( cwp && cwp != wp ){
unsigned char combuf[40],
*comptr= combuf;
int i;
*comptr= '\0';
switch( area ){
case aJIS:
i= SFTJIS( sjis );
if( i< 0 )
strcpy( combuf, "????" );
else
sprintf( combuf, "%04X", i );
break;
case aSJIS:
sprintf( combuf, "%04X", sjis );
break;
case aKUTEN:
i= SFTJIS( sjis );
if( i< 0 )
strcpy( combuf, "????" );
else
sprintf( combuf, "%04d", JISKUTEN(i) );
break;
case aCHAR:
*combuf= sjis/0x100;
combuf[1]= sjis & 0xff;
combuf[2]= '\0';
}
while( *comptr ){
info2.option= EventKey;
info2.KeyCode= *comptr++;
WindowSendEvent( cwp, &info2 );
}
if( area= aCHAR ){
unsigned short ptr[76+2];
unsigned short ptr2[76+2];
unsigned char *ptrp;
unsigned char *ptrp2;
struct FontPack {
short x,
y;
short code,
sendx,
sendy;
} pack;
void *compack[4]= {
(void*)0,
(void*)"\0FontData",
(void*)&pack
};
#ifdef USERSHEET
struct {
int h,
v,
hword;
short *buf1,
*buf2;
int sendx,
sendy;
} sheet;
unsigned short ptr3[76+2];
#endif
int j;
FNTGET( font/2, sjis, ptr );
for( j=2 ; j<38 ; j++ )
ptr[j]= ~ptr[j];
switch( ptr[0] ){
case 8:
ptrp= (unsigned char**)(ptr+2);
for( j=2 ; j<38 ; j++ )
ptr2[j]= (*ptrp++<<8)+255;
#ifdef USERSHEET
sheet.buf1= ptr2+2;
#endif
compack[3]= (void*)(ptr2+2);
break;
case 16:
#ifdef USERSHEET
sheet.buf1= ptr+2;
#endif
compack[3]= (void*)(ptr+2);
break;
case 24:
ptrp= (unsigned char**)(ptr+2);
ptrp2= (unsigned char**)(ptr2+2);
for( j=0 ; j<24 ; j++ ){
*ptrp2++= *ptrp++;
*ptrp2++= *ptrp++;
*ptrp2++= *ptrp++;
*ptrp2++= 255;
}
#ifdef USERSHEET
sheet.buf1= ptr2+2;
#endif
compack[3]= (void*)(ptr2+2);
break;
case 12:
ptrp= (unsigned char**)(ptr+2);
ptrp2= (unsigned char**)(ptr2+2);
for( j=0 ; j<24 ; j++ ){
*ptrp2++= *ptrp++;
*ptrp2++= *ptrp++;
}
#ifdef USERSHEET
sheet.buf1= ptr2+2;
#endif
compack[3]= (void*)(ptr2+2);
case 10:
ptrp= (unsigned char**)(ptr+2);
ptrp2= (unsigned char**)(ptr2+2);
for( j=0 ; j<20 ; j++ ){
*ptrp2++= *ptrp++;
*ptrp2++= *ptrp++;
}
#ifdef USERSHEET
sheet.buf1= ptr2+2;
#endif
compack[3]= (void*)(ptr2+2);
}
#ifdef USERSHEET
sheet.h= font;
sheet.v= font;
sheet.hword= (font+8)/16;
sheet.sendx= info->x;
sheet.sendy= info->y;
for( j=0 ; j<48 ; j++ )
ptr3[j]= 0;
sheet.buf2= ptr3;
#endif
pack.x= font;
pack.y= font;
pack.code= 1;
pack.sendx= info->x;
pack.sendy= info->y;
info2.option= EventUser;
info2.ComBuffer= compack;
info2.ComData= 256;
/* WindowSendEvent( cwp, &info2 );
*/
#ifdef USERSHEET
info2.option= EventUser;
info2.ComBuffer= &sheet;
info2.ComData= UserSheet;
WindowSendEvent( cwp, &info2 );
#endif
}
}
mspat(0);
return TRUE;
}else if(info->RightON ) {
if ( info->x<27 && info->x>1 &&
info->y<54 && info->y>28 ) {
switch(font) {
case 10:
font=24;
break;
case 12:
font=10;
break;
case 16:
font=12;
break;
case 24:
font=16;
break;
}
DrawSetLine(buf,1,28,25,52,1,OptionFill);
DrawSetCode(buf+1,0);
WindowDraw(wp,buf,5); /* 1+4 */
return TRUE;
}
return FALSE;
}
break;
case EventKey:
if( info->KeyCode != 13 ){
int i;
i= InputKey( buf, &i_jis, info->KeyCode, info->ShiftStat );
if( flag ){
info->KeyCode= 13;
WindowSendEvent( wp, info );
}else{
if( info->KeyCode >=0x80 )
flag= TRUE;
else
flag= FALSE;
WindowDraw( wp, buf, i );
}
}else{
int i;
char *p;
flag= FALSE;
if( *buf_jis >= 0x80 ){
i= *buf_jis*256+ buf_jis[1];
}else{
switch( mode ){
case mJIS:
i= JISSFT( strtol( buf_jis, &p, 16 ) );
break;
case mSJIS:
i= strtol( buf_jis, &p, 16 );
break;
case mKUTEN:
i= JISSFT( KUTENJIS( atoi( buf_jis ) ));
}
}
if( i>= 0x8000 ){
clearkey( buf, wp );
sjis= i;
DrawSetLine(buf,1,28,25,52,1,OptionFill);
DrawSetCode( buf+1, 0 );
WindowDraw(wp,buf,5);
}
}
return TRUE;
case EventMouseEnter:
case EventMouseOut: {
int i= InputSetCursorVisible( buf, &i_jis, info->option==EventMouseEnter );
if( i )
WindowDraw( wp, buf, i );
return TRUE;
}
/** Paste 情報の受取 1991 01/16 Ko-Window 2.07 に対応化 **/
case EventUser: {
char *ptr= (char*)info->ComBuffer;
if( info->ComData == UserPaste || info->ComData == UserString ){
while( *ptr ){
info->option= EventKey;
info->KeyCode= *ptr++;
WindowSendEvent( wp, info );
}
}
return TRUE;
}
/*********************************************************/
}
return FALSE;
}
/** コード表示 **/
DrawSetCode( buf, wp )
DrawBuf *buf;
WindowID wp;
{
int jis,
kuten;
if( (jis= SFTJIS( sjis )) < 0 ){
strcpy( s_jis, "JIS ????" );
strcpy( s_kuten, "区点 ????" );
}else{
sprintf( s_jis, "JIS %04X", jis );
kuten= JISKUTEN( jis );
sprintf( s_kuten, "区点 %04d", kuten );
}
sprintf( s_sjis, "SJIS %04X", sjis );
*s_chr= sjis/0x100;
s_chr[1]= sjis & 0xff;
DrawSetSymbol( buf , 2+24, 3 , s_jis, 9, 12 );
DrawSetSymbol( buf+1, 2+24, 21, s_sjis, 9, 12 );
DrawSetSymbol( buf+2, 2+24, 39, s_kuten, 9, 12 );
DrawSetSymbol( buf+3, 1 , 28, s_chr, 9, font );
if( wp )
WindowDraw( wp, buf, 4 );
}
/** シフトJISコードのインクリメント **/
inc1()
{
int i;
do{
if( ++sjis == 0xf600 )
sjis= 0x8000;
}while( !ishan(sjis) && ((i= sjis & 0xff)<0x40 || i==0x7f || i>0xfc ));
}
/** シフトJISコードのデクリメント **/
dec1()
{
int i;
do{
if( --sjis < 0x8000 )
sjis= 0xf5ff;
}while( !ishan(sjis) && ((i= sjis & 0xff)<0x40 || i==0x7f || i>0xfc ));
}
/** キーバッファのクリア **/
clearkey( buf, wp )
DrawBuf *buf;
WindowID wp;
{
DrawSetLine( buf, INPX, INPY, INPX+48, INPY+16, 1, OptionFill );
InputSetCursor( &i_jis, 0 );
*buf_jis= '\0';
WindowDraw( wp, buf, 1+ InputSetDraw( buf+1, &i_jis ) );
}
/** JISコードシフトJISへの変換 **/
JISSFT( code )
unsigned int code;
{
unsigned int h= (code >> 8) & 0x7f,
l= code & 0x7f;
return (( ((h-1)>>1 ) + ((h<=0x5e) ? 0x71 : 0xb1) )<<8)+( l + ((h & 1) ? ((l < 0x60) ? 0x1f : 0x20) : 0x7e) );
}